package com.java.sjzl.controller;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.java.sjzl.util.CommonUtil;
import com.java.sjzl.util.ExcelStyleUtil;
import com.java.sjzl.vo.UserExportVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

@Slf4j
public class EasyPoiExcel {
    private static final String BASE_DIRECTORY = "E:\\tmp\\excel";
    private static final String FILE_NAME = "exported_data_easy_poi.xlsx";

    public static void main(String[] args) {
        String filePath = BASE_DIRECTORY + File.separator + FILE_NAME;
        deleteFile(filePath);
        List<Object> userList = CommonUtil.generateDummyData(100);
        exportToExcel(filePath,userList);
        System.out.println("导出数据成功!，路径为："+filePath);
    }
    private static void deleteFile(String filePath) {
        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                System.out.println("删除旧文件成功");
            } else {
                System.out.println("删除旧文件失败");
            }
        }
    }

    /**
     * easyPoi直接导出到指定路径，重复调用覆盖
     * easypoi 库提供了基于注解的方式来实现 Excel 的导入和导出，但对于在现有文件的基础上追加数据的功能，其 API 并没有提供直接的支持。
     * 如果你要在现有 Excel 文件的末尾追加数据，通常的做法是先读取现有的 Excel 文件，然后将新数据追加到内存中，最后再重新写回到文件。而 easypoi 在设计上可能更倾向于一次性导出整个 Excel。
     * 如果需要一行一行写入硬盘，可以使用 Apache POI
     * @param filePath
     * @param list
     */
    private static void exportToExcel(String filePath, List<Object> list) {
        ExportParams exportParams  = new ExportParams("测试数据", "sheet1", ExcelType.XSSF);
        exportParams.setStyle(ExcelStyleUtil.class);
        try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, UserExportVO.class, list);
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



}
